﻿package org.core
{
	import flash.utils.Dictionary;
	import flash.utils.describeType;
	import flash.utils.getDefinitionByName;
	
	import org.interfaces.ICommand;
	import org.interfaces.IVO;
	
	/**
	 * 负责事件的发送和侦听 ，使用了单例模式
	 * @author as
	 * 
	 */   
	public class AbcDispatcher
	{
		/**
		 * 事件类型字典
		 */		
		private static var events:Object={}
			
		/**
		 * 逻辑类型字典 
		 */		
		private static var commands:Object={}
		

		public function AbcDispatcher() :void
		{
			
		}
		 
		/**
		 * 侦听事件  
		 * @param type 事件类型
		 * @param fun  响应事件函数
		 * 
		 */		
		public static function addEventListener(type : String, fun : Function=null) : void 
		{
			
			events[type]=events[type]||[]
				
			if(Boolean(fun)){
				
				if(events[type].indexOf(fun)==-1)events[type].push(fun)
					
			}else if(!commands[type]){
				
			commands[type] = function(e:IVO):void{
				
				var fun:Class = getDefinitionByName(type) as Class
					
				var command:ICommand=new fun() as ICommand
				
				command.execute(e)
				
			}
				
			events[type].push(commands[type])
				
			}

			//trace("addEventListener:"+type)

		}
		
		/**
		 * 删除侦听 
		 * @param type 事件类型
		 */      
		public static function removeEventListener(type:String,fun:Function=null) : void 
		{  
			if(!Boolean(events[type])){return;}
			
			var index:int
			
			if(Boolean(fun)){
				
				index=events[type].indexOf(fun)
					
				//如果为-1则splice方法会选择最后一个元素删除！！！！！！！！
					
				if(index!=-1){events[type].splice(index,1)	}

			}else{
				
				index=events[type].indexOf(commands[type])
					
				if(index!=-1){
					
				events[type].splice(index,1)	
				
				delete commands[type]
				
				}

			}
			
			//trace("removeEventListener:"+type)
				

		}
		
		/**
		 * 发送事件 
		 * @param type 事件类型
		 * @param data 事件引用的数据
		 * 注意：此处对events[type]做拷贝处理，因为函数执行时数组长度会改变
		 */      
		public static function dispatchEvent(type:String,data:*=null):void 
		{   
			if(Boolean(events[type])){
				
				var funs:Array=events[type].concat()
				
				for(var i:int=0;i< funs.length;i++){

					funs[i](data)
					
				}
				
				if(!hasEventListener(type)||events[type].length==0)delete events[type]
				
			}else{
				
			    //throw new Error(type+"对应的command未实现!")
			
			}
			
			//trace("dispatchEvent:"+type)

		}

		/**
		 * 检查 EventDispatcher 对象是否为特定事件类型注册了任何侦听器。
		 * @param type 事件的类型。  
		 * @return Boolean
		 * 
		 */
		public static function hasEventListener( type:String ) : Boolean 
		{
			return events[type]
		}
		

	}
}
